#include "ethercaterror.h"

/// 警告宏定义
#define D_WARM_RST_PFAIL (0x01)      //主电源缺相
#define D_WARM_LOW_BATT (0x02)     //电池电量不足
#define D_WARM_OV_TCMD (0x04)      //扭矩指令过大
#define D_WARM_OV_VCMD (0x08)      //速度指令过大
#define D_WARM_OV_LOAD (0X10)      //超载警告
#define D_WARM_SETUP (0x20)           //选定容量
#define D_WARM_UD_VTG (0x40)       //低电压警告
#define D_WARM_EMG (0x80)            //EMG警告

EthercatError::EthercatError()
{

}
//台达的 文档是16bit+16bit的错误码，不知道哪个才是603f的
//英威腾 文档是16bit+16bit的错误码，不知道哪个才是603f的
//sx 报警 只取后16bit , 即  code=0xFF0C&0x00FF = 0x0c =12
QString EthercatError::geterror( int vendor, int error_code  )
{
    switch( vendor )
    {
    case D_VENDOR_ID_TCR:
        return tcr_error(error_code );
    case D_VENDOR_ID_Delta:
        return delta_error(error_code);
    case D_VENDOR_ID_Sanyo:
        return sanyo_error(error_code);
    case D_VENDOR_ID_LS:
        return ls_error(error_code);
    case D_VENDOR_ID_Panasonic:
        return panasonic_error(error_code);
    case D_VENDOR_ID_Invt:
        return invt_error(error_code);
    default:
        return ("其他品牌伺服异常保护 !");
    }
}


QString EthercatError::getwarn( int vendor, int error_code )
{
    QString msg;
    switch( vendor )
    {
    case D_VENDOR_ID_TCR:
        msg= tcr_warn(error_code  );
        break;
    default:
        switch( error_code )
        {
        case D_WARM_RST_PFAIL:
            msg="主电源缺相！";
            break;
        case D_WARM_LOW_BATT:
            msg= "电池电量不足!";
            break;
        case D_WARM_OV_TCMD:
            msg=  "扭矩指令过大!";
            break;
        case D_WARM_OV_VCMD:
            msg=  "速度指令过大!";
            break;
        case D_WARM_OV_LOAD:
            msg="过载警告!";
            break;
        case D_WARM_SETUP:
            msg="选定容量!";
            break;
        case D_WARM_UD_VTG:
            msg="低电压警告!";
            break;
        case D_WARM_EMG:
            msg="EMG警告!";
            break;
        default:
            msg=":伺服警告保护!";
            break;
        }
        break;
    }
    return msg;
}

//三洋的603f ,PDO映射有问题读取失败，用sdo读取603f就正常
QString EthercatError::sanyo_error(int error_code)
{
#if 1
    //0x2102
    int err=error_code&0x00FF;
    switch( err )
    {
    case 0x10:  return "端口 0 连续接收无效数据帧 !";
    case 0x11:  return "端口 0 丢失链接 !";
    case 0x12:  return "端口 0 连续发生 Rx 错误 !";
    case 0x13:  return "端口 1 连续发生 Rx 错误 !";
    case 0x14:  return "端口 0 连续发生 TX 错误 !";
    case 0x15:  return "端口 1 连续发生 TX 错误 !";
    case 0x18:  return "端口 0 丢失链接 !";
    case 0x19:  return "端口 1 丢失链接 !";
    case 0x1A:  return "通信超时 !";
    case 0x21:  return "主电路电源设备异常 !";
    case 0x22:  return "电流检出异常0 !";
    case 0x23:  return "电流检出异常1 !";
    case 0x24:  return "电流检出异常2 !";
    case 0x25:  return "安全转矩(推力)切断异常 1 !";
    case 0x26:  return "安全转矩(推力)切断异常 2 !";
    case 0x41:  return "过载1 !";
    case 0x42:  return "过载2 !";
    case 0x43:  return "再生过载 !";
    case 0x44:  return "磁极位置检出异常 !";
    case 0x45:  return "连续转速过大 !";
    case 0x51:  return "驱动器温度异常 !";
    case 0x52:  return "防浪涌电阻过热 !";
    case 0x53:  return "动态制动器电阻过热 !";
    case 0x54:  return "内部再生电阻过热 !";
    case 0x55:  return "外部过热 !";
    case 0x56:  return "主电路电源设备过热 !";
    case 0x61:  return "过电压 !";
    case 0x62:  return "主电路电源不足 !";
    case 0x63:  return "主电源欠相 !";
    case 0x71:  return "控制电源电压过低 !";
    case 0x72:  return "控制电源电压过低 !";
    case 0x73:  return "控制电源电压过低 !";
    case 0x81:  return "编码器连接器 1 断线 !";
    case 0x83:  return "编码器连接器 2 断线 !";
    case 0x84:  return "串行编码器通信异常 !";
    case 0x85:  return "编码器初始处理异常 !";
    case 0x86:  return "CS 异常 !";
    case 0x87:  return "CS 断线 !";
    case 0xA0:  return "串行编码器内部异常0, 多圈计数器溢出 !";
    case 0xA1:  return "串行编码器内部异常1,电池电压过低 !";
    case 0xA2:  return "串行编码器内部异常2,加速度异常 !";
    case 0xA3:  return "串行编码器内部异常3,超速异常 !";
    case 0xA4:  return "串行编码器内部异常4 ,编码器内部 EEPROM 的读取操作异常!";
    case 0xA5:  return "串行编码器内部异常5,检出单圈系数不良 !";
    case 0xA6:  return "串行编码器内部异常6,检出多圈系数不良 !";
    case 0xA9:  return "串行编码器内部异常9,伺服电机内置编码器过热 !";
    case 0xAA:  return "串行编码器内部异常10,增量异常(位置数据异常) !";
    case 0xAC:  return "串行编码器内部异常12,多圈生成异常 !";
    case 0xAD:  return "串行编码器内部异常13,未设置编码器内置 EEPROM 数据 !";
    case 0xAE:  return "串行编码器内部异常14,旋转变压器输出异常 !";
    case 0xAF:  return "串行编码器内部异常15,旋转变压器断线 !";
    case 0xC1:  return "超速 !";
    case 0xC2:  return "速度控制异常 !";
    case 0xC3:  return "速度反馈异常 !";
    case 0xD1:  return "模型跟随抑振控制异常 !";
    case 0xD2:  return "位置偏差过大 !";
    case 0xD3:  return "位置指令异常1 !";
    case 0xDE:  return "位置指令异常2 !";
    case 0xDF:  return "退出测试模式 !";
    case 0xE1:  return "EEPROM 异常 !";
    case 0xE2:  return "EEPROM 校验和异常 !";
    case 0xE3:  return "存储器异常 1 !";
    case 0xE4:  return "存储器异常 2 !";
    case 0xE5:  return "系统参数超出设置范围 !";
    case 0xE6:  return "系统参数与驱动器不匹配 !";
    case 0xE7:  return "电机参数异常 !";
    case 0xE8:  return "CPU 周边电路异常 !";
    case 0xE9:  return "系统编码错误 !";
    case 0xEA:  return "电机编码设置异常 !";
    case 0xEB:  return "传感器编码设置异常 !";
    case 0xEE:  return "无法自动配置电机参数 !";
    case 0xEF:  return "自动配置电机参数结果异常 !";
    case 0xF1:  return "任务处理异常,周期同步异常 !";
    case 0xF2:  return "初始化超时 !";
    case 0xFF:  return "闪存超时 !";
    default:
        return "其他错误 !";
    }
#else
    //603f
    switch( error_code )
    {
    case 0x7510:
        return "通信错误";

    case 0x7520:
        return "端口 0 丢失链接!";

    case 0x5400:
        return "主电路电源设备异常 (电源元件异常) !";

    case 0x5210:
        return "电流检出异常 !";

    case 0x8312:
        return "安全转矩(推力)切断异常 !";

    case 0x8311:
        return "过载1 !";

    case 0x2220:
        return "过载2 !";

    case 0x3212:
        return "再生过载 !";

        //    case 0x7300:
        //        return "磁极位置检出异常 !";

        //    case 0x8400:
        //        return "连续转速过大 !";

    case 0x4110:
        return "驱动器温度异常 !";

    case 0x4210:
        return "电阻过热/主电路电源设备过热 !";

    case 0x4310:
        return "外部过热 !";

    case 0x3211:
        return "过电压 !";

    case 0x3220:
        return "主电路电源不足 !";

    case 0x3130:
        return "主电源欠相 !";

    case 0x5114:
        return "控制电源电压过低 !";

    case 0x5115:
        return "控制电源电压过低 1 !";

    case 0x5113:
        return "控制电源电压过低 2 !";

    case 0x7305:
        return "编码器连接器 1 断线 !";

    case 0x7306:
        return "编码器连接器 2 断线 !";

    case 0x7300:
        return "串行编码器异常 !";

    case 0x7310:
        return "串行编码器内部异常2 !";

    case 0x7320:
        return "串行编码器内部异常 10 !";

    case 0x7303:
        return "串行编码器内部异常 14 !";

    case 0x7304:
        return "串行编码器内部异常 15 !";

    case 0x8400:
        return "超速/速度控制异常 !";

    case 0x7122:
        return "速度反馈异常 !";

    case 0x8500:
        return "位置指令异常/模型跟随抑振控制异常 !";

    case 0x8611:
        return "位置偏差过大 !";

    case 0xFF01:
        return "参数变更完毕 !";

    case 0xFF00:
        return "退出测试模式 !";

    case 0x5530:
        return "EEPROM 异常 !";

    case 0x6310:
        return "EEPROM 校验和异常 !";

    case 0x5510:
        return "存储器异常 !";

    case 0x5220:
        return "系统编码错误 /CPU 周边电路异常 !";

    case 0x6320:
        return "系统参数异常/电机参数异常 !";

    case 0x8700:
        return "任务处理异常 !";

    case 0x6010:
        return "初始化超时 !";

    default:
        return "其他错误 !";
    }
#endif
}
//sx 报警 只取后16bit , 即  code=0xFF0C&0x00FF = 0x0c =12
QString EthercatError::panasonic_error(int error_code)
{
    //sx 报警 只取后16bit , 即  code=0xFF0C&0x00FF = 0x0c =12
    int err= 0x00FF & error_code;
    switch( err )
    {
    case 80:
        return "PDO 看门狗异常保护/ 同期信号异常保护 !";

    case 81:
        return "设定异常保护: DC/Mailbox/SM/PDO看门狗/ 同期周期 !";

    case 85:
        return "PDO分配异常/ SII异常保护 !";

    case 88:
        return "(主电源电压不足/不正常动作/控制模式)异常保护 !";

    case 11:
        return "控制电源电压不足 !";

    case 12:
        return "过压保护 !";

    case 13:
        return "主电源电压不足 !";

    case 14:
        return "过电流保护/IPM异常 !";

    case 15:
        return "过热保护 !";

    case 16:
        return "过载保护 !";

    case 18:
        return "回升过负载 !";

    case 21:
        return "编码器通信异常 !";

    case 23:
        return "编码器通信数据异常 !";

    case 24:
        return "位置偏差过大/速度偏差过大 !";

    case 25:
        return "混合偏差过大 !";

    case 26:
        return "过速度保护 !";

    case 27:
        return "指令异常保护／位置信息初始化异常保护 !";

    case 28:
        return "脉冲再生限制保护 !";

    case 29:
        return "计数器溢出保护 !";

    case 30:
        return "安全输入保护 !";
    case 33:
        return "输入输出分配异常保护 !";
    case 34:
        return "电机可移动范围设定异常保护 !";
    case 36:
        return "EEPROM参数异常保护 !";
    case 37:
        return "EEPROM确认代码异常保护 !";
    case 38:
        return "驱动禁止输入保护 !";
    case 40:
        return "绝对式系统关闭保护 !";
    case 41:
        return "绝对式计数器溢出保护 !";
    case 42:
        return "绝对式过速保护 !";
    case 43:
        return "增量式编码器初始化异常保护 !";
    case 44:
        return "回转计数1异常保护 !";
    case 45:
        return "回转计数异常保护 !";
    case 47:
        return "绝对式状态异常保护 !";
    case 48:
        return "增量式状态Z相异常保护 !";
    case 49:
        return "增量式状态CS相异常保护 !";
    case 50:
        return "外部光栅尺数据异常／未接地 !";
    case 51:
        return "外部光栅尺ST异常 !";
    case 55:
        return "A.B.Z相接线异常保护 !";
    case 84:
        return "同期建立初始化异常保护 !";
    case 87:
        return "强制报警输入保护 !";
    case 91:
        return "命令异常保护 !";
    case 92:
        return "编码器数据复原异常/外部光栅尺数据复原异常 !";
    case 93:
        return "参数设定异常/外部光栅尺接地异常 !";
    case 94:
        return "原点复位异常２ !";
    case 95:
        return "电机自动识别异常保护 !";
    case 98:
        return "通信IC初始化异常保护 !";

    default:
        return QString("其他异常保护,错误码:%1").arg( error_code );
    }
}
//英威腾　文档是16bit+16bit的错误码，不知道哪个才是603f的
QString EthercatError::invt_error(int error_code)
{
    switch( error_code )
    {
    case 0xFF010101:
        return "IGBT 故障 !";

    case 0x73000200:
        return "编码器故障-编码器断线 !";

    case 0x73000201:
        return "编码器故障-编码器反馈误差过大 !";

    case 0x73000202:
        return "编码器故障-奇偶校验错误 !";

    case 0x73000203:
        return "编码器故障-CRC校验错误 !";

    case 0x73000204:
        return "编码器故障-帧错误 !";

    case 0x73000205:
        return "编码器故障-短帧错误 !";

    case 0x73000206:
        return "编码器故障-编码器报超时 !";

    case 0x73000207:
        return "编码器故障-FPGA报超时 !";

    case 0x73000208:
        return "编码器故障-编码器电池低压报警 !";

    case 0x73000209:
        return "编码器故障-编码器电池欠压故障 !";

    case 0x7300020A:
        return "编码器故障-编码器过热 !";

    case 0x7300020B:
        return "编码器故障-编码器EEPROM写入错误 !";

    case 0x73000300:
        return "电流传感器故障-U相电流传感器故障 !";

    case 0x73000301:
        return "电流传感器故障-V相电流传感器故障 !";

    case 0x73000302:
        return "电流传感器故障-W相电流传感器故障 !";

    case 0xFF010400:
        return "系统初始化故障 !";

    case 0xFF010501:
        return "设置故障-电机型号不存在 !";

    case 0xFF010502:
        return "设置故障-电机和驱动器型号不匹配 !";

    case 0xFF010503:
        return "设置故障-软限位设置故障 !";

    case 0xFF010504:
        return "设置故障-会原点模式设置故障 !";

    case 0xFF010505:
        return "设置故障-点位控制行程故障 !";

    case 0x7100700:
        return "再生放电过载 !";

    case 0x54410800:
        return "模拟输入过压-模拟量速度指令 !";

    case 0x54420801:
        return "模拟输入过压-模拟量转距指令 !";

    case 0x54430802:
        return "模拟输入过压-模拟量输入3 !";

    case 0x55300900:
        return "EEPROM-读写故障 !";

    case 0x55300901:
        return "EEPROM-数据校验故障 !";

    case 0x554400A00:
        return "硬件故障-FPGA故障 !";

    case 0x55440A01:
        return "硬件故障-通信卡故障 !";

    case 0x55440A02:
        return "硬件故障-对敌短路故障 !";

    case 0x55440A03:
        return "硬件故障-外部输入故障 !";

    case 0x44580A04:
        return "硬件故障-紧急停机故障 !";

    case 0x61000b01:
        return "软件故障-周期任务重入 !";

    case 0x61000b02:
        return "软件故障-非法操作 !";

    case 0xFF010C00:
        return "IO故障-开关量输入分配重复 !";

    case 0xFF010C01:
        return "IO故障-脉冲输入频率过高 !";

    case 0x31100D00:
        return "主回路过压故障 !";

        ///
    case 0x31200d01:
        return "主回路欠压故障 !";

    case 0x52000e00:
        return "控制电源欠压故障 !";

    case 0x23101200:
        return "电机过载故障 !";
    case 0x71801300:
        return "速度故障 !";

    case 0x84001400:
        return "速度超差 !";

    case 0x85001600:
        return "位置超差 !";

    case 0xff011601:
        return "混合控制偏差过大 !";

    case 0xff011602:
        return "位置增量溢出故障 !";

    default:
        return QString("其他异常保护,错误码:%1").arg( error_code );
    }
}
//台达的文档是16bit+16bit的错误码，不知道哪个才是603f的
QString EthercatError::delta_error(int error_code)
{
    switch(error_code)
    {
    case 	2310	:	return  "过电流 !" ;
    case 	3110	:	return  "过电压 !" ;
    case 	3120	:	return  "低电压 !" ;
    case 	7122	:	return  "电机匹配错误 !" ;
    case 	3210	:	return  "回生异常 !" ;
    case 	3230	:	return  "过负荷 !" ;
    case 	8400	:	return  "过速度 !" ;
    case 	8600	:	return  "异常脉冲控制命令 !" ;
    case 	8611	:	return  "位置控制误差过大 !" ;
        //  case 	0000	:	return  "保留 !" ;
    case 	7305	:	return  "编码器异常 !" ;
    case 	6320	:	return  "校正异常 !" ;
    case 	5441	:	return  "紧急停止 !" ;
    case 	5443	:	return  "反向极限异常 !" ;
    case 	5442	:	return  "正向极限异常 !" ;
    case 	4210	:	return  "IGBT过热 !" ;
    case 	5330	:	return  "参数内存异常 !" ;
    case 	7306	:	return  "检出器输出异常 !" ;
    case 	7510	:	return  "串行通讯异常 !" ;
    case 	7520	:	return  "串行通讯逾时 !" ;
    case 	3130	:	return  "主回路电源异常 !" ;
    case 	3231	:	return  "预先过负载警告 !" ;
        //    case 	7305	:	return  "编码器初始磁场错误 !" ;
        //    case 	7305	:	return  "编码器内部错误 !" ;
        //    case 	7305	:	return  "编码器内部数据可靠度错误 !" ;
        //    case 	7305	:	return  "编码器内部重置错误 !" ;
    case 	7121	:	return  "电机碰撞错误 !" ;
    case 	3300	:	return  "电机U、V、W接线错误 !" ;
    case 	8610	:	return  "全闭环位置控制误差过大 !" ;
    case 	5500	:	return  "DSP 韧体升级 !" ;
    case 	6310	:	return  "数据初始错误 !" ;
    case 	5444	:	return  "软件正向极限 !" ;
    case 	5445	:	return  "软件负向极限 !" ;
    case 	8120	:	return  "EtherCAT 通讯中断(Servo Off) !" ;

        //    case 	8130 	:	return  "Node guarding 或 heartbeat 错误(Servo Off) !" ;
    case 	8130	:	return  "存取CANopen PDO对象时 发生错误 !" ;
        //    case 	8130	:	return  "存取CANopen PDO对象时sub-index发生错误 !" ;
        //   case 	8200	:	return  "存取CANopen PDO对象时数据长度发生错误 !" ;
        //    case 	8200	:	return  "存取CANopen PDO对象时数据范围发生错误 !" ;
        //    case 	8200	:	return  "CANopen PDO 对象是只读不可写入 !" ;
        //    case 	8200	:	return  "CANopen PDO 对象无法支持PDO !" ;
        //    case 	8200	:	return  "CANopen PDO 对象在 Servo On时 不允许写入 !" ;
        //    case 	8200	:	return  "由EEPROM读取CANopen PDO 对象时发生错误 !" ;
        //    case 	8200	:	return  "将CANopen PDO对象写入EEPROM时发生错误 !" ;
        //    case 	8200	:	return  "EEPROM的地址超过限制 !" ;
        //    case 	8200	:	return  "EEPROM数据内容错误 !" ;
        //    case 	8200	:	return  "密码错误 !" ;
        //    case 	6310	:	return  "CANopen 数据初始错误  !" ;
        //    case 	6200	:	return  "CANopen 同步失败(Servo Off) !" ;
        //    case 	6200	:	return  "CANopen 同步信号错误(Servo Off) !" ;
        //    case 	6200	:	return  "CANopen 同步信号逾时(Servo Off) !" ;
        //    case 	6200	:	return  "CANopen IP 命令失效(Servo Off) !" ;
    case 	6200	:	return  "同步信号周期错误(Servo Off) !" ;
        //    case 	9000	:	return  "STO功能被启动(Servo Off) !" ;
        //    case 	9000	:	return  "STO_A无信号(Servo Off) !" ;
        //    case 	9000	:	return  "STO_B无信号(Servo Off) !" ;
    case 	9000	:	return  "STO错误(Servo Off) !" ;

        /*SDO :错误信息 Abort Code
05040001 h 客户 / 伺服命令无效或不存在
06010002 h 尝试写入只读对象
06020000 h 对象不存在于对象字典内
06040041 h 无法将对象映像至 PDO
06040042 h 映像的物件数目及长度超过 PDO 长度
06060000 h 因为硬件错误导致存取失败(储存或还原错误)
06070010 h 数据型态不符;参数长度不符
06090011 h Sub-index 不存在
06090030 h 参数数值超出范围(写入)
08000000 h 一般错误
080000a1 h 从 EEPROM 读取对象时发生错误
080000a2 h 将对象写入 EEPROM 时发生错误
080000a3 h 存取 EEPROM 时的范围无效
080000a4 h 存取 EEPROM 时,EEPROM 的数据内容发生错误
080000a5 h 写入加密区时,输入的密码错误
08000020 h 无法传输数据或将数据储存至应用程序内
08000021 h
因为限制(以错误状态储存或还原)导致无法传输数据,或无法将数据储存至应用程
序内
08000022 h 对象使用中
*/
    default:
        return QString("其他异常保护,错误码:%1").arg( error_code );
    }
}
//ok
QString  EthercatError::ls_error(int error_code)
{
    switch( error_code )
    {
    case 0x10:
        return "IPM错误，过电流(H/W) !";

    case 0x11:
        return "IPM过热 ,请检查接线 !";

    case 0x14:
        return "过电流(S/W) !";

    case 0x15:
        return "电流漂移异常 !";

    case 0x16:
        return "过电流(H/W) !";

    case 0x21:
        return "连续超载 !";

    case 0x22:
        return "驱动器过热 !";

    case 0x23:
        return "再生超载 !";

    case 0x24:
        return "电路回路中断 !";

    case 0x30:
        return "串行编码器通信错误 !";

    case 0x31:
        return "编码器电缆断开 !";

    case 0x32:
        return "编码器数据错误 !";

    case 0x33:
        return "电机 ID 设置错误 !";

    case 0x40:
        return "低电压 !";

    case 0x41:
        return "过电压 !";

    case 0x42:
        return "主电源异常 !";

    case 0x43:
        return "控制电源异常 !";

    case 0x50:
        return "超速 !";

    case 0x51:
        return "位置误差过大 !";

    case 0x53:
        return "脉冲指令频率异常 !";

    case 0x63:
        return "参数异常 !";

    case 0x64:
        return "参数范围以上 !";

    case 0x65:
        return "EtherCAT 通信异常1 !";
    case 0x66:
        return "EtherCAT 通信异常2 !";
    case 0x67:
        return "EtherCAT 通信异常3 !";

    case 0x71:
        return "出厂值发生错误 !";

    case 0x72:
        return "输出接点设置异常 !";

    default:
        return QString("其他异常保护,错误码:%1").arg( error_code );
    }
}

//ok
QString EthercatError::tcr_warn(int error_code  )
{
    //~0x0(1)0FF故障码保留
    //-------------------------------------
    //;2.警告代码:
    switch( error_code )
    {
    //    case 0xE00:
    //        return "ER.警告最小值 !";

    case 0x001:
        return "ER.E01 电机过热警告 !";

    case 0x002:
        return "ER.E02 驱动器过热警告 !";

    case 0x003:
        return "ER.E03 电机过载警告 !";

    case 0x004:
        return "ER.E04 驱动器过载警告 !";

    case 0x005:
        return "ER.E05 位置偏差太大警告 !";

    case 0x006:
        return "ER.E06 制动过载警告 !";

    case 0x007:
        return "ER.E07 正向超程警告 !";

    case 0x008:
        return "ER.E08 反向超程警告 !";

    default:
        return QString("其他异常保护,警告码:%1").arg( error_code );
    }

}
QString EthercatError::tcr_error(int error_code  )
{
    //1.故障码:
    switch( error_code )
    {
    case 0x0001:
        return "ER.001  硬件(短路)保护 !";

    case 0x0002:
        return "ER.002 HOC !";

    case 0x0003:
        return "ER.003 AD模块初始校正故障 !";

    case 0x0104:
        return "ER.004  参数存储异常 !";

    case 0x0005:
        return "ER.005  系统参数异常 !";

    case 0x0006:
        return "ER.006 Ad采样模块故障 !";

    case 0x0007:
        return "ER.007  编码器异常1 断线 !";

    case 0x0008:
        return "ER.008  编码器异常2 AB干扰 !";

    case 0x0009:
        return "ER.009  编码器异常3 Z干扰 !";

    case 0x000A://0x110A
        return "ER.00A 母线欠压故障 !";

    case 0x000B:
        return "ER.00b 母线过压故障 !";

    case 0x000C://0x100C
        return "ER.00C 软件过流故障 !";

    case 0x000D://0x100D
        return "ER.00d 电机过载故障 !";

    case 0x000E://0x110E
        return "ER.00E 驱动器过载 !";

    case 0x000F://0x110F
        return "ER.00F 电机过热 !";

    case 0x010://0x1110
        return "ER.010  驱动器过热 !";

    case 0x011://0x1111
        return "ER.011  风扇异常 !";

    case 0x012://0x1012
        return "ER.012  过速 !";

    case 0x013://0x1113
        return "ER.013  位置偏差过大故障 !";

    case 0x014://0x1114
        return "ER.014  母线电压缺相故障 !";

    case 0x015://0x1015
        return "ER.015  电机相序错误 !";

    case 0x0016:
        return "ER.016  驱动器额定电流输入错误(或code不存在) !";

    case 0x017://0x1117
        return "ER.017  制动电阻过载故障 !";

    case 0x0018:
        return "ER.018  绝对值编码器过热 !";

    case 0x019://0x1019
        return "ER.019  绝对值编码器电池电压低于3.1V,电池电压偏低 !";

    case 0x001A:
        return "ER.01A 绝对值编码器电池电压低于2.5V,多圈位置信息已丢失 !";

    case 0x001B:
        return "ER.01b 驱动器和电机不匹配 !";

    case 0x01C://0x101C
        return "ER.01C 原点回归失败 !";

    case 0x01d:// 0x101D
        return "ER.01d 主电源掉电 !";

    case 0x01E://0x101e
        return "ER.01E 偏移角学习失败 !";

    case 0x001F:
        return "ER.01F !";

    case 0x0020:
        return "ER.020 ECAT 初始化LAN9252错误 !";

    case 0x021://0x1021
        return "ER.021 ECAT DSP与ESC通信中断 !";

    case 0x022://0x1022
        return "ER.022 ECAT 与主机通讯中断 !";

    case 0x023://0x1123
        return "ER.023 ECAT PDO通信参数在Servo读 !";

    case 0x024://0x1124
        return "ER.024 ECAT PDO通信没有要查找的索引和子索引 !";

    case 0x025://0x1125
        return "ER.025 ECAT PDO通信设置同步时间超范围 !";

    case 0x026://0x1126
        return "ER.026 ECAT PDO通信数据超范围 !";

    case 0x0027:
        return "ER.027 UVW对地短路故障 !";

    case 0x028://0x1028
        return "ER.028  惯量辨识失败 !";

    case 0x030://0x1030
        return "ER.030 402 位置正向极限 !";

    case 0x031://0x1031
        return "ER.031 402 位置负向极限 !";

    default:
        return QString("其他异常保护,错误码:%1").arg( error_code );
    }
}




